javascript oop、instanceof 和基类
全部标签 PreC++11,我问这是否可以使用私有(private)/未实现的技巧(参见here)。显然,这是不可能的。我想知道新的=delete语法是否改变了事态,因为强制派生类不可复制仍然是一个有用的特性。更新后的代码片段可能看起来像这样:classBase{public:Base(){}virtual~Base(){}Base(constBase&)=delete;Base&operator=(constBase&)=delete;virtualvoidinterfaceFunction()=0;//etc.//nodatamembers};classData{/*...*/};class
我有一个类结构如下:classBase{public:voidsetDefault(uint8_tmy_default){m_default=my_default;}voidmethod(uint8_t*subject){method(subject,m_default);}virtualvoidmethod(uint8_t*subject,uint8_tparameter)=0;protected:uint8_tm_default;};classDerived1:publicBase{public:voidmethod(uint8_t*subject,uint8_tparameter
#include#includeclassEntity{public:boolhinders_sight=false;};classPillar:publicEntity{public:boolhinders_sight=true;};intmain(){std::vectorEntities;Pillarpillar;Entities.push_back(&pillar);std::couthinders_sightpillar.hinders_sight返回true(它应该如此)但是Entities[0]->hinders_sight返回false。如何从vector到达pilla
我遇到过这样一种情况,我的类模板部分特化共享大量代码,将它们移到基类中是有意义的。然而,所有的特化都具有相同基类是没有意义的。以下示例代码在GCC7.1中编译无误:structfoo_base_1{voidbar(){std::coutstructfoo{};templatestructfoo:foo_base_1{};templatestructfoo:foo_base_2{};intmain(){foox;fooy;x.bar();y.bar();}我意识到尽管它们是同一类的特化,但它们实际上是不同的类型。仍然,感觉同一个类可以从不同的基础继承是错误的。我想要的是一些保证,这没关系
让我们从代码示例开始,因为应该很容易看出发生了什么:templatestructBase{usingType=int;};templatestructDerived:publicBase{//error:unknowntypename'Type'usingNewType=Type;};intmain(){}我原以为Derived会找到Base的Type别名。但是,我尝试过的所有编译器(MSVC、Clang、GCC)似乎都不喜欢这段代码。更令人惊讶的是,将Derived的继承更改为:structDerived:publicBase解决问题。有什么我可以更改以允许Derived找到Base
如果一个基类没有虚析构函数(例如为了避免vtable条目)并且派生类只有基本属性,它是否释放了new分配的所有内存,当基类的指针被删除?我知道Derived类的析构函数不会被调用,但我想知道整个对象分配的内存是否会被释放?我还假设在Derived指针上调用delete将释放整个内存空间。此外,如果它不释放内存的派生类部分,它如何在相同的情况下工作,但使用基类中的虚拟析构函数,知道要释放多少内存?例子:classBase{public:inta;intb;Base(){}~Base(){}};classDerived:publicBase{public:intc;intd;Derived
假设我们有这四个类:二叉树,SplayTree(它是BinaryTree的子类),二进制节点和SplayNode(它是BinaryNode的子类)。在BinaryTree类中,我有这两个函数,在SplayTree中,我想重用第一个函数,因为它的工作方式与SplayTree中的相同。//BinaryTree.cppboolFind(constT&data)const{Node*found=Find2(data,root);//...}virtualNode*Find2(constT&data,Node*node)const{//...}//SplayTree.cppusingBinary
[class.derived]的第一段说的是基类说明符,Ifthenamefoundisnotaclass-name,theprogramisill-formed.但是,一个simple测试表明Comeau和g++-ansi-pedantic都接受typedef-name作为基础。Boostheader上的简单grep-r'[^:]:mpl'表明流行的库通常依赖于这种行为。是否有任何编译器实际上拒绝了基说明符中类的typedef?GCC甚至检查基类类型是否不是const,这改进了非标准功能。有解决办法吗?我唯一能想到的就是用C++11别名模板替换typedef。一个模板化的别名声明声明
在visualc++中接受以下代码时,g++将生成错误:“类Derived没有任何字段名称Base”哪个符合标准?templateclassBase{public:Base(){};};templateclassDerived:publicBase{public:Derived():Base(){}};顺便说一句:两者都接受Derived():Base(){}所以同时,我会关注gcc 最佳答案 MSVC++不正确。Base是模板,不是类型。请注意,在通常情况下,Base在Derived的范围内查找,这意味着它将首先找到继承自Base
是否可以在编译时自动判断一个类是否为抽象基类?我有一个对象工厂,通过其他通用代码,它有时会用抽象基类类型实例化。该代码无法编译,因为它在ABC上调用了newT()。在这种情况下,我最终不得不专门为每个ABC创建代码的对象工厂来代替assert(0)。如果可以在编译时自动确定类型是否为ABC,则可以自动进行这种专门化。一个简化的例子如下://thisprogramcodecompilesw/gcc4.4#include#include//Howtoautomaticallyspecializethisclassatcompile-time?templatestructisAbstract